const express = require('express');
const router = express.Router();
const Book = require('../models/Book');

// 获取所有图书
router.get('/', async (req, res, next) => {
  try {
    const books = await Book.find().sort({ createdAt: 'desc' });
    res.render('books/index', { books });
  } catch (err) {
    next(err);
  }
});

// 显示添加图书表单
router.get('/new', (req, res) => {
  res.render('books/new', { book: new Book() });
});

// 创建新图书
router.post('/', async (req, res, next) => {
  const book = new Book(req.body);
  try {
    const newBook = await book.save();
    res.redirect(`/books`);
  } catch (err) {
    res.render('books/new', { book: book });
  }
});

// 显示编辑表单
router.get('/:id/edit', async (req, res, next) => {
  try {
    const book = await Book.findById(req.params.id);
    if (!book) return res.redirect('/books');
    res.render('books/edit', { book: book });
  } catch (err) {
    next(err);
  }
});

// 更新图书
router.put('/:id', async (req, res) => {
  try {
    // 1. 直接使用 `findByIdAndUpdate` 替代 `find` + `save`
    const book = await Book.findByIdAndUpdate(
      req.params.id,
      req.body, // 自动匹配模型字段
      { new: true, runValidators: true } // 返回更新后的数据，并触发验证
    );
    if (!book) {
      return res.redirect('/books'); // 图书不存在
    }
    res.redirect('/books');
  } catch (err) {
    // 2. 错误处理：回显用户输入（req.body）和错误信息
    res.render('books/edit', { 
      book: req.body, // 保留用户已修改的数据
      error: '更新失败，请检查输入'
    });
  }
});


// 删除图书
router.delete('/:id', async (req, res, next) => {
  try {
    await Book.findByIdAndDelete(req.params.id);
    res.redirect('/books');
  } catch (err) {
    next(err);
  }
});

module.exports = router;
